package com.wonders.bigdata.dubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * Description: <br>
 *
 * @author: XB
 * @date: 2022/2/8 15:44
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    /**
     * 上下文
     */
    private ChannelHandlerContext context;
    /**
     * 返回的结果
     */
    private String result;
    /**
     * 客户端调用方法时传入的参数
     */
    private String param;

    /**
     * (1)
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 因为我们在其他方法中会使用到ctx
        context = ctx;
    }

    /**
     * （4）
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        result = msg.toString();
        // 唤醒等待的线程
        notify();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    /**
     * 被代理对象调用，发送数据给服务器，-》wait-》等待被唤醒（channelRead）-》返回结果（3）
     * @return
     * @throws Exception
     */
    @Override
    public synchronized Object call() throws Exception {
        context.writeAndFlush(param);
        // 进行等待
        // 等待channelRead方法获取到服务器的结果后，唤醒
        wait();
        return result;
    }

    /**
     * 第二个被调用
     * @param param
     */
    public void setParam(String param) {
        this.param = param;
    }
}
